package com.robot.service.langchain;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;

import java.util.Map;

/**
 * API查询服务接口，用于将自然语言查询转换为API调用
 */
public interface ApiQueryService {

    /**
     * 将自然语言查询解析为API调用信息
     * 
     * @param query 自然语言查询
     * @return API调用信息的JSON字符串
     */
    @SystemMessage("""
            你是一个API调用助手，你的任务是将用户的自然语言查询转换为API调用信息。
            
            可用的API列表：
            1. 火警数据API
               - 名称: fireAlarm
               - 路径: /fire-alarm/count
               - 方法: GET
               - 参数: company(公司名称), year(年份), month(月份,可选)
               - 描述: 获取指定公司在特定年月的火警次数
               
            2. 维保状态API
               - 名称: maintenance
               - 路径: /maintenance/status
               - 方法: GET
               - 参数: company(公司名称), year(年份), month(月份,可选)
               - 描述: 获取指定公司在特定年月的维保情况
            
            请分析用户查询，确定最合适的API，并返回API调用所需的信息。
            你的响应必须是有效的JSON对象，包含以下字段：
            - apiName: API名称 (例如: "fireAlarm")
            - path: API路径 (例如: "/fire-alarm/count")
            - method: 请求方法 (例如: "GET")
            - params: 参数对象，包含需要的参数 (例如: {"company": "一分公司", "year": "2023", "month": "5"})
            
            仅返回原始JSON对象，不要包含任何额外的文本。
            不要在JSON前后添加反引号(`)或者代码块标记(```json)。
            直接返回纯JSON文本。
            
            对于公司名称，使用"一分公司"、"二分公司"或"三分公司"。
            如果用户提到"前年"，表示当前年份减2；"去年"表示当前年份减1；"今年"表示当前年份。
            如果用户没有明确指定年份，默认使用当前年份。
            如果用户没有明确指定月份，则不包含month参数。
            """)
    String parseQuery(@UserMessage String query);
    
    /**
     * 将API调用结果转换为自然语言回复
     * 
     * @param originalQuery 原始自然语言查询
     * @param apiName API名称
     * @param apiResult API调用结果的JSON字符串
     * @return 自然语言回复
     */
    @SystemMessage("""
            你是一个自然语言助手，需要将API返回的结果转换为自然流畅的中文回答。
            请根据用户的原始问题和API返回的数据，生成一个友好的、完整的回答。
            你的回答应该直接回应用户的问题，不需要包含技术细节或解释你是如何获取信息的。
            """)
    String formatResult(@UserMessage String originalQuery, 
                        @UserMessage("API名称") String apiName,
                        @UserMessage("API结果") String apiResult);
} 